package com.zenithmind.version.pojo.domain;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 文件版本实体类 - 遵循单一职责原则，只包含文件版本基本信息
 *
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("version_file_version")
@Schema(description = "文件版本实体")
public class FileVersion extends BaseEntity {

    /**
     * 仓库ID
     */
    @Schema(description = "仓库ID")
    private String repositoryId;

    /**
     * 提交ID
     */
    @Schema(description = "提交ID")
    private String commitId;

    /**
     * 提交哈希
     */
    @Schema(description = "提交哈希")
    private String commitHash;

    /**
     * 文件路径
     */
    @Schema(description = "文件路径")
    private String filePath;

    /**
     * 版本号
     */
    @Schema(description = "版本号")
    private Integer versionNumber;

    /**
     * 文件名
     */
    @Schema(description = "文件名")
    private String fileName;

    /**
     * 文件扩展名
     */
    @Schema(description = "文件扩展名")
    private String fileExtension;

    /**
     * 文件类型（1-文本，2-二进制，3-图片，4-视频，5-音频，6-文档）
     */
    @Schema(description = "文件类型（1-文本，2-二进制，3-图片，4-视频，5-音频，6-文档）")
    private Integer fileType;

    /**
     * 文件内容哈希
     */
    @Schema(description = "文件内容哈希")
    private String contentHash;

    /**
     * 文件存储路径
     */
    @Schema(description = "文件存储路径")
    private String storagePath;

    /**
     * 变更类型（1-新增，2-修改，3-删除，4-重命名，5-移动）
     */
    @Schema(description = "变更类型（1-新增，2-修改，3-删除，4-重命名，5-移动）")
    private Integer changeType;

    /**
     * 旧文件路径（重命名或移动时）
     */
    @Schema(description = "旧文件路径（重命名或移动时）")
    private String oldFilePath;

    /**
     * 文件编码
     */
    @Schema(description = "文件编码")
    private String encoding;

    /**
     * MIME类型
     */
    @Schema(description = "MIME类型")
    private String mimeType;

    /**
     * 是否二进制文件（0-否，1-是）
     */
    @Schema(description = "是否二进制文件（0-否，1-是）")
    private Integer isBinary;

    /**
     * 检查是否为文本文件
     *
     * @return 是否为文本文件
     */
    public boolean isTextFile() {
        return Integer.valueOf(1).equals(this.fileType);
    }

    /**
     * 检查是否为二进制文件
     *
     * @return 是否为二进制文件
     */
    public boolean isBinaryFile() {
        return Integer.valueOf(1).equals(this.isBinary);
    }

    /**
     * 检查是否为新增文件
     *
     * @return 是否为新增文件
     */
    public boolean isNewFile() {
        return Integer.valueOf(1).equals(this.changeType);
    }

    /**
     * 检查是否为删除文件
     *
     * @return 是否为删除文件
     */
    public boolean isDeletedFile() {
        return Integer.valueOf(3).equals(this.changeType);
    }

    /**
     * 检查是否为重命名文件
     *
     * @return 是否为重命名文件
     */
    public boolean isRenamedFile() {
        return Integer.valueOf(4).equals(this.changeType);
    }

    /**
     * 获取文件名（不含扩展名）
     *
     * @return 文件名
     */
    public String getFileNameWithoutExtension() {
        if (fileName == null) {
            return null;
        }
        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex > 0) {
            return fileName.substring(0, lastDotIndex);
        }
        return fileName;
    }
}
